home *** CD-ROM | disk | FTP | other *** search
/ Hackers Underworld 2: Forbidden Knowledge / Hackers Underworld 2: Forbidden Knowledge.iso / HACKING / UNIX_NEW.TXT < prev    next >
Internet Message Format  |  1994-07-17  |  32KB

  1. From: sahayman@iuvax.cs.indiana.edu (Steve Hayman)
  2. Newsgroups: comp.unix.questions,comp.unix.wizards
  3. Subject: Frequently Asked Questions about Unix - with Answers [Monthly posting]
  4. Message-ID: <FAQ2.9@iuvax.cs.indiana.edu>
  5. Date: 1 Dec 89 19:54:14 GMT
  6. Expires: 1 Jan 90 05:00:00 GMT
  7. Followup-To: comp.unix.questions
  8. Organization: Computer Science Department, Indiana University
  9. Lines: 865
  10. Supersedes: <FAQ2.8@iuvax.cs.indiana.edu>
  11.  
  12. [Last changed: $Date: 89/12/01 14:50:10 $ by $Author: sahayman $]
  13.  
  14. This article contains the answers to some Frequently Asked Questions
  15. often seen in comp.unix.questions and comp.unix.wizards.  Please don't
  16. ask these questions again, they've been answered plenty of times
  17. already - and please don't flame someone just because they may not have
  18. read this particular posting.  Thank you.
  19.  
  20. This article includes answers to:
  21.  
  22.  
  23.     How do I remove a file whose name begins with a "-" ?
  24.     How do I remove a file with funny characters in the filename ?
  25.     How do I get a recursive directory listing?
  26.     How do I get the current directory into my prompt?
  27.     How do I read characters from a terminal without requiring the user
  28.         to hit RETURN?
  29.     How do I read characters from the terminal in a shell script?
  30.     How do I check to see if there are characters to be read without
  31.         actually reading?
  32.     How do I find the name of an open file?
  33.     How do I rename "*.foo" to "*.bar", or change file names to lowercase?
  34.     Why do I get [some strange error message] when I "rsh host command" ?
  35.     How do I find out the creation time of a file?
  36.     How do I use "rsh" without having the rsh hang around
  37.         until the remote command has completed?
  38.     How do I truncate a file?
  39.     How do I {set an environment variable, change directory} inside a
  40.         shell script and have that change affect my current shell?
  41.     Why doesn't find's "{}" symbol do what I want?
  42.     How do I redirect stdout and stderr separately in csh?
  43.     How do I set the permissions on a symbolic link?
  44.     What does {awk,grep,fgrep,egrep,biff,cat,gecos,nroff,troff,tee,bss}
  45.         stand for?
  46.     How do I pronounce "vi" , or "!", or "/*", or ...?
  47.  
  48.  
  49.  
  50. While these are all legitimate questions, they seem to crop up in
  51. comp.unix.questions on an annual basis, usually followed by plenty
  52. of replies (only some of which are correct) and then a period of
  53. griping about how the same questions keep coming up.  You may also like
  54. to read the monthly article "Answers to Frequently Asked Questions"
  55. in the newsgroup "news.announce.newusers", which will tell you what
  56. "UNIX" stands for.
  57.  
  58. With the variety of Unix systems in the world, it's hard to guarantee
  59. that these answers will work everywhere.  Read your local manual pages
  60. before trying anything suggested here.  If you have suggestions or
  61. corrections for any of these answers, please send them to to
  62. sahayman@iuvax.cs.indiana.edu or iuvax!sahayman.
  63.  
  64. 1)  How do I remove a file whose name begins with a "-" ?
  65.  
  66.     Figure out some way to name the file so that it doesn't
  67.     begin with a dash.  The simplest answer is to use   
  68.  
  69.         rm ./-filename
  70.  
  71.     (assuming "-filename" is in the current directory, of course.)
  72.     This method of avoiding the interpretation of the "-" works
  73.     with other commands too.
  74.  
  75.     Many commands, particularly those that have been written to use
  76.     the "getopt(3)" argument parsing routine, accept a "--" argument
  77.     which means "this is the last option, anything after this is not
  78.     an option", so your version of rm might handle "rm -- -filename".
  79.     Some versions of rm that don't use getopt() treat a single "-"
  80.     in the same way, so you can also try "rm - -filename".
  81.     
  82. 2)  How do I remove a file with funny characters in the filename ?
  83.  
  84.     The  classic answers are
  85.  
  86.     rm -i some*pattern*that*matches*only*the*file*you*want
  87.  
  88.     which asks you whether you want to remove each file matching
  89.     the indicated pattern;  depending on your shell, this may
  90.     not work if the filename has a character with the 8th bit set
  91.     (the shell may strip that off);
  92.     
  93.     and
  94.  
  95.     rm -ri .
  96.  
  97.     which asks you whether to remove each file in the directory,
  98.     answer "y" to the problem file and "n" to everything else.,
  99.     and which, unfortunately, doesn't work with many versions of rm;
  100.     (always take a deep breath and think about what you're doing
  101.     and double check what you typed when you use rm's "-r" flag)
  102.  
  103.     and
  104.  
  105.     find . -type f ... -ok rm '{}' \;
  106.  
  107.     where "..." is a group of predicates that uniquely identify the
  108.     file.  One possibility is to figure out the inode number
  109.     of the problem file (use "ls -i .") and then use
  110.  
  111.     find . -inum 12345 -ok rm '{}' \;
  112.     
  113.     or
  114.     find . -inum 12345 -ok mv '{}' new-file-name \;
  115.     
  116.     
  117.     "-ok" is a safety check - it will prompt you for confirmation of the
  118.     command it's about to execute.  You can use "-exec" instead to avoid
  119.     the prompting, if you want to live dangerously, or if you suspect
  120.     that the filename may contain a funny character sequence that will mess
  121.     up your screen when printed.
  122.  
  123.     If none of these work, find your system manager.
  124.  
  125. 3)  How do I get a recursive directory listing?
  126.  
  127.     One of the following may do what you want:
  128.  
  129.     ls -R             (not all versions of "ls" have -R)
  130.     find . -print        (should work everywhere)
  131.     du -a .            (shows you both the name and size)
  132.     
  133.     If you're looking for a wildcard pattern that will match
  134.     all ".c" files in this directory and below, you won't find one,
  135.     but you can use
  136.  
  137.     % some-command `find . -name '*.c' -print`
  138.  
  139.     "find" is a powerful program.  Learn about it.
  140.  
  141. 4)  How do I get the current directory into my prompt?
  142.  
  143.     It depends which shell you are using.  It's easy with some shells,
  144.     hard or impossible with others.
  145.     
  146.     C Shell (csh):
  147.     Put this in your .cshrc - customize the prompt variable
  148.     the way you want.
  149.  
  150.         alias setprompt 'set prompt="${cwd}% "'
  151.         setprompt        # to set the initial prompt
  152.         alias cd 'chdir \!* && setprompt'
  153.     
  154.     If you use pushd and popd, you'll also need
  155.  
  156.         alias pushd 'pushd \!* && setprompt'
  157.         alias popd  'popd  \!* && setprompt'
  158.  
  159.     Some C shells don't keep a $cwd variable - you can use
  160.     `pwd` instead.
  161.  
  162.     If you just want the last component of the current directory
  163.     in your prompt ("mail% " instead of "/usr/spool/mail% ")
  164.     you can use
  165.  
  166.         alias setprompt 'set prompt="$cwd:t% "'
  167.  
  168.     
  169.     Some older csh's get the meaning of && and || reversed.
  170.     Try doing:
  171.  
  172.         false && echo bug
  173.  
  174.     If it prints "bug", you need to switch && and || (and get
  175.     a better version of csh.)
  176.  
  177.  
  178.     Bourne Shell (sh):
  179.  
  180.     If you have a newer version of the Bourne Shell (SVR2 or newer)
  181.     you can use a shell function to make your own command, "xcd" say:
  182.  
  183.         xcd() { cd $* ; PS1="`pwd` $ "; }
  184.  
  185.     If you have an older Bourne shell, it's complicated but not impossible.
  186.     Here's one way.  Add this to your .profile file:
  187.  
  188.         LOGIN_SHELL=$$ export LOGIN_SHELL
  189.         CMDFILE=/tmp/cd.$$ export CMDFILE
  190.         PROMPTSIG=16 export PROMPTSIG
  191.         trap '. $CMDFILE' $PROMPTSIG
  192.  
  193.     and then put this executable script (without the indentation!),
  194.     let's call it "xcd", somewhere in your PATH 
  195.  
  196.         : xcd directory - change directory and set prompt
  197.         : by signalling the login shell to read a command file
  198.         cat >${CMDFILE?"not set"} <<EOF
  199.         cd $1
  200.         PS1="\`pwd\`$ "
  201.         EOF
  202.         kill -${PROMPTSIG?"not set"} ${LOGIN_SHELL?"not set"}
  203.  
  204.     Now change directories with "xcd /some/dir".
  205.  
  206.  
  207.     Korn Shell (ksh):
  208.  
  209.     Put this in your .profile file:
  210.         PS1='$PWD $ '
  211.     
  212.     If you just want the last component of the directory, use
  213.         PS1='${PWD##*/} $ '
  214.  
  215.  
  216. 5)  How do I read characters from a terminal without requiring the user
  217.     to hit RETURN?
  218.  
  219.     Check out cbreak mode in BSD, ~ICANON mode in SysV. 
  220.  
  221.     If you don't want to tackle setting the terminal parameters
  222.     yourself (using the "ioctl(2)" system call) you can let the stty
  223.     program do the work - but this is slow and inefficient, and you
  224.     should change the code to do it right some time:
  225.  
  226.     main()
  227.     {
  228.         int c;
  229.  
  230.         printf("Hit any character to continue\n");
  231.         /*